1
Una transacción es una unidad de trabajo
DSAI2202Transactions in SQL Databases
00:00

Los cambios de datos rara vez llegan solos: una transferencia debe debitar una cuenta y acreditar otra, y un pedido debe reservar stock y registrar un pago. Si el sistema se detiene a mitad de camino, la base de datos queda describiendo un mundo que nunca existió. Una transacción es la respuesta de la base de datos a ese problema: una secuencia de una o más operaciones que la base de datos trata como una única unidad de trabajo indivisible.

Todo o nada

Dentro de una transacción, cada operación pertenece a un único resultado. La base de datos nunca expone un estado final en el que solo haya ocurrido parte de la transacción. La ilustración clásica es una transferencia entre dos cuentas bancarias: reducir el saldo de la cuenta de origen y luego aumentar el saldo de la cuenta de destino. Si solo se realizara el primer paso, el dinero desaparecería; si solo se realizara el segundo, el dinero aparecería de la nada. Envolver ambos pasos en una sola transacción elimina ambas posibilidades.

Esta garantía de todo o nada se denomina atomicidad. Commit es el acto que hace permanentes los cambios de la transacción; una transacción que nunca hace commit no deja rastro alguno. Durabilidad añade la pieza final: una vez que un commit ha retornado, el cambio sobrevive aunque la máquina pierda energía un instante después.

Una transacción es una unidad de trabajoUna transacción es una unidad de trabajoAtomicidad: todo o nada.Límite de la transacciónuna unidad de trabajoPaso 1 — Debitar la cuenta de origenPaso 2 — Acreditar la cuenta de destinoExisten estados intermedios dentro del límite,pero son privados de esta transacción.✓COMMITAmbos cambios permanentesSobrevive a una caída tras el commit↺ROLLBACKNinguna cuenta cambióNo deja rastro algunoUna transacción es una secuencia de una o más operaciones tratadas como una única unidad de trabajo indivisible.

Una transacción es un límite

Ayuda a imaginar una transacción como un límite trazado alrededor de un grupo de sentencias. Antes del límite y después de él, los datos satisfacen las reglas que impone la estructura. Dentro del límite existen estados intermedios —una cuenta ya está debitada mientras que la otra aún no ha sido acreditada—, pero esos estados son privados de la transacción. Las sentencias posteriores en otras sesiones no los toman como la verdad.

Dos funciones a la vez

Por lo tanto, las transacciones cumplen dos funciones. La primera es el manejo de fallos: si el proceso se bloquea, la conexión se cae o una sentencia produce un error, la base de datos puede restaurar el estado que existía antes de que comenzara la transacción. La segunda es el control de visibilidad: mientras el trabajo está en curso, otros lectores quedan protegidos del resultado inacabado. Estas dos funciones están relacionadas pero no son idénticas: la atomicidad decide si los cambios se conservan, mientras que la visibilidad se rige por el aislamiento, la configuración que controla cuánto pueden ver entre sí las transacciones concurrentes.

Mantén la unidad en una sola conexión
El estado de la transacción pertenece a una conexión o sesión, por lo que la sentencia que abre la transacción y el commit que la finaliza deben ejecutarse en la misma conexión. Muchos controladores también se ejecutan en modo autocommit , en el que cada sentencia individual es su propia transacción; una unidad con varias sentencias necesita desactivar autocommit o un inicio explícito.